package cn.itsource.pethome.base.config;

import cn.itsource.pethome.base.util.RedisService;
import cn.itsource.pethome.org.domain.Employee;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 自定义的拦截器：
 *      目的： 在每一次前端请求进入到controller之前，进行token的校验工作
 *
 *      具体实现的功能：
 *          验证token:
 *              1. token保存在哪里？请求头
 *              2. 后台中的token保存在哪里？  Redis
 *  注意事项：在程序中，如果要使用@Autowrired来注入对象，必须当前使用注入的类，也被 spring管理
 */
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
    @Autowired
    private RedisService redisService;

    //在执行controller之前，会触发，如果返回 False，将不会再往下走（不再进入controller）
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println(">>>>>>>>>>>>>>");
        //1. 先从请求头中，取出token
        String token = request.getHeader("token");
        if (StringUtils.isBlank(token)) {
            return false;
        }
        //2. 从redis中根据token取出保存的登录用户信息
        Employee employee = redisService.getKeyObjectValue(token, Employee.class);
        if (employee == null) {
            return false;
        }

        //3. 重置登录的过期时间
        redisService.setStringKeyAndValue(token, employee,30);
        System.out.println(">>>>>>>>>>>>>>>进入到 拦截器");
        return true;
    }
}